home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Unix / Shells / tcsh / Source / ed.term.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-21  |  25.4 KB  |  1,114 lines

  1. /* $Header: /u/christos/src/tcsh-6.03/RCS/ed.term.c,v 1.12 1992/10/05 02:41:30 christos Exp $ */
  2. /*
  3.  * ed.term.c: Low level terminal interface
  4.  */
  5. /*-
  6.  * Copyright (c) 1980, 1991 The Regents of the University of California.
  7.  * All rights reserved.
  8.  *
  9.  * Redistribution and use in source and binary forms, with or without
  10.  * modification, are permitted provided that the following conditions
  11.  * are met:
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in the
  16.  *    documentation and/or other materials provided with the distribution.
  17.  * 3. All advertising materials mentioning features or use of this software
  18.  *    must display the following acknowledgement:
  19.  *    This product includes software developed by the University of
  20.  *    California, Berkeley and its contributors.
  21.  * 4. Neither the name of the University nor the names of its contributors
  22.  *    may be used to endorse or promote products derived from this software
  23.  *    without specific prior written permission.
  24.  *
  25.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  26.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  27.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  28.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  29.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  30.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  31.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  32.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  33.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  34.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  35.  * SUCH DAMAGE.
  36.  */
  37. #include "sh.h"
  38.  
  39. RCSID("$Id: ed.term.c,v 1.12 1992/10/05 02:41:30 christos Exp $")
  40.  
  41. #include "ed.h"
  42. #include "ed.term.h"
  43.  
  44. int didsetty = 0;
  45. ttyperm_t ttylist = {   
  46.     {
  47. #if defined(POSIX) || defined(TERMIO)
  48.     { "iflag:", ICRNL, (INLCR|IGNCR) },
  49.     { "oflag:", (OPOST|ONLCR), ONLRET },
  50.     { "cflag:", 0, 0 },
  51.     { "lflag:", (ISIG|ICANON|ECHO|ECHOE|ECHOCTL|IEXTEN|IDEFAULT),
  52.             (NOFLSH|ECHONL|EXTPROC|FLUSHO) },
  53. #else /* GSTTY */
  54.     { "nrmal:", (ECHO|CRMOD|ANYP), (CBREAK|RAW|LCASE|VTDELAY|ALLDELAY) },
  55.     { "local:", (LCRTBS|LCRTERA|LCRTKIL), (LPRTERA|LFLUSHO) },
  56. #endif /* POSIX || TERMIO */
  57.     { "chars:",     0, 0 },
  58.     },
  59.     {
  60. #if defined(POSIX) || defined(TERMIO)
  61.     { "iflag:", (INLCR|ICRNL), IGNCR },
  62.     { "oflag:", (OPOST|ONLCR), ONLRET },
  63.     { "cflag:", 0, 0 },
  64.     { "lflag:", ISIG,
  65.             (NOFLSH|ICANON|ECHO|ECHOK|ECHONL|EXTPROC|IEXTEN|FLUSHO|
  66.              IDEFAULT) },
  67. #else /* GSTTY */
  68.     { "nrmal:", (CBREAK|CRMOD|ANYP), (RAW|ECHO|LCASE|VTDELAY|ALLDELAY) },
  69.     { "local:", (LCRTBS|LCRTERA|LCRTKIL), (LPRTERA|LFLUSHO) },
  70. #endif /* POSIX || TERMIO */
  71.     { "chars:", (C_SH(C_MIN)|C_SH(C_TIME)|C_SH(C_SWTCH)|C_SH(C_DSWTCH)|
  72.              C_SH(C_WERASE)|C_SH(C_REPRINT)|C_SH(C_SUSP)|C_SH(C_DSUSP)|
  73.              C_SH(C_EOF)|C_SH(C_EOL)|C_SH(C_DISCARD)|C_SH(C_PGOFF)|
  74.              C_SH(C_KILL2)|C_SH(C_PAGE)|C_SH(C_STATUS)|C_SH(C_LNEXT)), 
  75.              0 }
  76.     },
  77.     {
  78. #if defined(POSIX) || defined(TERMIO)
  79.     { "iflag:", 0, IXON | IXOFF },
  80.     { "oflag:", 0, 0 },
  81.     { "cflag:", 0, 0 },
  82.     { "lflag:", 0, ISIG | IEXTEN },
  83. #else /* GSTTY */
  84.     { "nrmal:", RAW, CBREAK },
  85.     { "local:", 0, 0 },
  86. #endif /* POSIX || TERMIO */
  87.     { "chars:", 0, 0 },
  88.     }
  89. };
  90.  
  91. static struct tcshmodes {
  92.     char *m_name;
  93.     int   m_value;
  94.     int   m_type;
  95. } modelist[] = {
  96. #if defined(POSIX) || defined(TERMIO)
  97.  
  98. # ifdef    IGNBRK
  99.     { "ignbrk",    IGNBRK,    M_INPUT },
  100. # endif /* IGNBRK */
  101. # ifdef    BRKINT
  102.     { "brkint",    BRKINT,    M_INPUT },
  103. # endif /* BRKINT */
  104. # ifdef    IGNPAR
  105.     { "ignpar",    IGNPAR,    M_INPUT },
  106. # endif /* IGNPAR */
  107. # ifdef    PARMRK
  108.     { "parmrk",    PARMRK,    M_INPUT },
  109. # endif /* PARMRK */
  110. # ifdef    INPCK
  111.     { "inpck",    INPCK,    M_INPUT },
  112. # endif /* INPCK */
  113. # ifdef    ISTRIP
  114.     { "istrip",    ISTRIP,    M_INPUT },
  115. # endif /* ISTRIP */
  116. # ifdef    INLCR
  117.     { "inlcr",    INLCR,    M_INPUT },
  118. # endif /* INLCR */
  119. # ifdef    IGNCR
  120.     { "igncr",    IGNCR,    M_INPUT },
  121. # endif /* IGNCR */
  122. # ifdef    ICRNL
  123.     { "icrnl",    ICRNL,    M_INPUT },
  124. # endif /* ICRNL */
  125. # ifdef    IUCLC
  126.     { "iuclc",    IUCLC,    M_INPUT },
  127. # endif /* IUCLC */
  128. # ifdef    IXON
  129.     { "ixon",    IXON,    M_INPUT },
  130. # endif /* IXON */
  131. # ifdef    IXANY
  132.     { "ixany",    IXANY,    M_INPUT },
  133. # endif /* IXANY */
  134. # ifdef    IXOFF
  135.     { "ixoff",    IXOFF,    M_INPUT },
  136. # endif /* IXOFF */
  137. # ifdef  IMAXBEL
  138.     { "imaxbel",IMAXBEL,M_INPUT },
  139. # endif /* IMAXBEL */
  140. # ifdef  IDELETE
  141.     { "idelete",IDELETE,M_INPUT },
  142. # endif /* IDELETE */
  143.  
  144. # ifdef    OPOST
  145.     { "opost",    OPOST,    M_OUTPUT },
  146. # endif /* OPOST */
  147. # ifdef    OLCUC
  148.     { "olcuc",    OLCUC,    M_OUTPUT },
  149. # endif /* OLCUC */
  150. # ifdef    ONLCR
  151.     { "onlcr",    ONLCR,    M_OUTPUT },
  152. # endif /* ONLCR */
  153. # ifdef    OCRNL
  154.     { "ocrnl",    OCRNL,    M_OUTPUT },
  155. # endif /* OCRNL */
  156. # ifdef    ONOCR
  157.     { "onocr",    ONOCR,    M_OUTPUT },
  158. # endif /* ONOCR */
  159. # ifdef ONOEOT
  160.     { "onoeot",    ONOEOT,    M_OUTPUT },
  161. # endif /* ONOEOT */
  162. # ifdef    ONLRET
  163.     { "onlret",    ONLRET,    M_OUTPUT },
  164. # endif /* ONLRET */
  165. # ifdef    OFILL
  166.     { "ofill",    OFILL,    M_OUTPUT },
  167. # endif /* OFILL */
  168. # ifdef    OFDEL
  169.     { "ofdel",    OFDEL,    M_OUTPUT },
  170. # endif /* OFDEL */
  171. # ifdef    NLDLY
  172.     { "nldly",    NLDLY,    M_OUTPUT },
  173. # endif /* NLDLY */
  174. # ifdef    CRDLY
  175.     { "crdly",    CRDLY,    M_OUTPUT },
  176. # endif /* CRDLY */
  177. # ifdef    TABDLY
  178.     { "tabdly",    TABDLY,    M_OUTPUT },
  179. # endif /* TABDLY */
  180. # ifdef    XTABS
  181.     { "xtabs",    XTABS,    M_OUTPUT },
  182. # endif /* XTABS */
  183. # ifdef    BSDLY
  184.     { "bsdly",    BSDLY,    M_OUTPUT },
  185. # endif /* BSDLY */
  186. # ifdef    VTDLY
  187.     { "vtdly",    VTDLY,    M_OUTPUT },
  188. # endif /* VTDLY */
  189. # ifdef    FFDLY
  190.     { "ffdly",    FFDLY,    M_OUTPUT },
  191. # endif /* FFDLY */
  192. # ifdef    PAGEOUT
  193.     { "pageout",PAGEOUT,M_OUTPUT },
  194. # endif /* PAGEOUT */
  195. # ifdef    WRAP
  196.     { "wrap",    WRAP,    M_OUTPUT },
  197. # endif /* WRAP */
  198.  
  199. # ifdef    CIGNORE
  200.     { "cignore",CIGNORE,M_CONTROL },
  201. # endif /* CBAUD */
  202. # ifdef    CBAUD
  203.     { "cbaud",    CBAUD,    M_CONTROL },
  204. # endif /* CBAUD */
  205. # ifdef    CSTOPB
  206.     { "cstopb",    CSTOPB,    M_CONTROL },
  207. # endif /* CSTOPB */
  208. # ifdef    CREAD
  209.     { "cread",    CREAD,    M_CONTROL },
  210. # endif /* CREAD */
  211. # ifdef    PARENB
  212.     { "parenb",    PARENB,    M_CONTROL },
  213. # endif /* PARENB */
  214. # ifdef    PARODD
  215.     { "parodd",    PARODD,    M_CONTROL },
  216. # endif /* PARODD */
  217. # ifdef    HUPCL
  218.     { "hupcl",    HUPCL,    M_CONTROL },
  219. # endif /* HUPCL */
  220. # ifdef    CLOCAL
  221.     { "clocal",    CLOCAL,    M_CONTROL },
  222. # endif /* CLOCAL */
  223. # ifdef    LOBLK
  224.     { "loblk",    LOBLK,    M_CONTROL },
  225. # endif /* LOBLK */
  226. # ifdef    CIBAUD
  227.     { "cibaud",    CIBAUD,    M_CONTROL },
  228. # endif /* CIBAUD */
  229. # ifdef CRTSCTS
  230. #  ifdef CCTS_OFLOW
  231.     { "ccts_oflow",CCTS_OFLOW,M_CONTROL },
  232. #  else
  233.     { "crtscts",CRTSCTS,M_CONTROL },
  234. #  endif /* CCTS_OFLOW */
  235. # endif /* CRTSCTS */
  236. # ifdef CRTS_IFLOW
  237.     { "crts_iflow",CRTS_IFLOW,M_CONTROL },
  238. # endif /* CRTS_IFLOW */
  239. # ifdef MDMBUF
  240.     { "mdmbuf",    MDMBUF,    M_CONTROL },
  241. # endif /* MDMBUF */
  242. # ifdef RCV1EN
  243.     { "rcv1en",    RCV1EN,    M_CONTROL },
  244. # endif /* RCV1EN */
  245. # ifdef XMT1EN
  246.     { "xmt1en",    XMT1EN,    M_CONTROL },
  247. # endif /* XMT1EN */
  248.  
  249. # ifdef    ISIG
  250.     { "isig",    ISIG,    M_LINED },
  251. # endif /* ISIG */
  252. # ifdef    ICANON
  253.     { "icanon",    ICANON,    M_LINED },
  254. # endif /* ICANON */
  255. # ifdef    XCASE
  256.     { "xcase",    XCASE,    M_LINED },
  257. # endif /* XCASE */
  258. # ifdef    ECHO
  259.     { "echo",    ECHO,    M_LINED },
  260. # endif /* ECHO */
  261. # ifdef    ECHOE
  262.     { "echoe",    ECHOE,    M_LINED },
  263. # endif /* ECHOE */
  264. # ifdef    ECHOK
  265.     { "echok",    ECHOK,    M_LINED },
  266. # endif /* ECHOK */
  267. # ifdef    ECHONL
  268.     { "echonl",    ECHONL,    M_LINED },
  269. # endif /* ECHONL */
  270. # ifdef    NOFLSH
  271.     { "noflsh",    NOFLSH,    M_LINED },
  272. # endif /* NOFLSH */
  273. # ifdef    TOSTOP
  274.     { "tostop",    TOSTOP,    M_LINED },
  275. # endif /* TOSTOP */
  276. # ifdef    ECHOCTL
  277.     { "echoctl",ECHOCTL,M_LINED },
  278. # endif /* ECHOCTL */
  279. # ifdef    ECHOPRT
  280.     { "echoprt",ECHOPRT,M_LINED },
  281. # endif /* ECHOPRT */
  282. # ifdef    ECHOKE
  283.     { "echoke",    ECHOKE,    M_LINED },
  284. # endif /* ECHOKE */
  285. # ifdef    DEFECHO
  286.     { "defecho",DEFECHO,M_LINED },
  287. # endif /* DEFECHO */
  288. # ifdef    FLUSHO
  289.     { "flusho",    FLUSHO,    M_LINED },
  290. # endif /* FLUSHO */
  291. # ifdef    PENDIN
  292.     { "pendin",    PENDIN,    M_LINED },
  293. # endif /* PENDIN */
  294. # ifdef    IEXTEN
  295.     { "iexten",    IEXTEN,    M_LINED },
  296. # endif /* IEXTEN */
  297. # ifdef    NOKERNINFO
  298.     { "nokerninfo",NOKERNINFO,M_LINED },
  299. # endif /* NOKERNINFO */
  300. # ifdef    ALTWERASE
  301.     { "altwerase",ALTWERASE,M_LINED },
  302. # endif /* ALTWERASE */
  303. # ifdef    EXTPROC
  304.     { "extproc",EXTPROC,M_LINED },
  305. # endif /* EXTPROC */
  306. # ifdef IDEFAULT
  307.     { "idefault",IDEFAULT,M_LINED },
  308. # endif /* IDEFAULT */
  309.  
  310. #else /* GSTTY */
  311.  
  312. # ifdef    TANDEM
  313.     { "tandem",    TANDEM,    M_CONTROL },
  314. # endif /* TANDEM */
  315. # ifdef    CBREAK
  316.     { "cbreak",    CBREAK,    M_CONTROL },
  317. # endif /* CBREAK */
  318. # ifdef    LCASE
  319.     { "lcase",    LCASE,    M_CONTROL },
  320. # endif /* LCASE */
  321. # ifdef    ECHO
  322.     { "echo",    ECHO,    M_CONTROL },
  323. # endif /* ECHO */    
  324. # ifdef    CRMOD
  325.     { "crmod",    CRMOD,    M_CONTROL },
  326. # endif /* CRMOD */
  327. # ifdef    RAW
  328.     { "raw",    RAW,    M_CONTROL },
  329. # endif /* RAW */
  330. # ifdef    ODDP
  331.     { "oddp",    ODDP,    M_CONTROL },
  332. # endif /* ODDP */
  333. # ifdef    EVENP
  334.     { "evenp",    EVENP,    M_CONTROL },
  335. # endif /* EVENP */
  336. # ifdef    ANYP
  337.     { "anyp",    ANYP,    M_CONTROL },
  338. # endif /* ANYP */
  339. # ifdef    NLDELAY
  340.     { "nldelay",NLDELAY,M_CONTROL },
  341. # endif /* NLDELAY */
  342. # ifdef    TBDELAY
  343.     { "tbdelay",TBDELAY,M_CONTROL },
  344. # endif /* TBDELAY */
  345. # ifdef    XTABS
  346.     { "xtabs",    XTABS,    M_CONTROL },
  347. # endif /* XTABS */
  348. # ifdef    CRDELAY
  349.     { "crdelay",CRDELAY,M_CONTROL },
  350. # endif /* CRDELAY */
  351. # ifdef    VTDELAY
  352.     { "vtdelay",VTDELAY,M_CONTROL },
  353. # endif /* VTDELAY */
  354. # ifdef    BSDELAY
  355.     { "bsdelay",BSDELAY,M_CONTROL },
  356. # endif /* BSDELAY */
  357. # ifdef    CRTBS
  358.     { "crtbs",    CRTBS,    M_CONTROL },
  359. # endif /* CRTBS */
  360. # ifdef    PRTERA
  361.     { "prtera",    PRTERA,    M_CONTROL },
  362. # endif /* PRTERA */
  363. # ifdef    CRTERA
  364.     { "crtera",    CRTERA,    M_CONTROL },
  365. # endif /* CRTERA */
  366. # ifdef    TILDE
  367.     { "tilde",    TILDE,    M_CONTROL },
  368. # endif /* TILDE */
  369. # ifdef    MDMBUF
  370.     { "mdmbuf",    MDMBUF,    M_CONTROL },
  371. # endif /* MDMBUF */
  372. # ifdef    LITOUT
  373.     { "litout",    LITOUT,    M_CONTROL },
  374. # endif /* LITOUT */
  375. # ifdef    TOSTOP
  376.     { "tostop",    TOSTOP,    M_CONTROL },
  377. # endif /* TOSTOP */
  378. # ifdef    FLUSHO
  379.     { "flusho",    FLUSHO,    M_CONTROL },
  380. # endif /* FLUSHO */
  381. # ifdef    NOHANG
  382.     { "nohang",    NOHANG,    M_CONTROL },
  383. # endif /* NOHANG */
  384. # ifdef    L001000
  385.     { "l001000",L001000,M_CONTROL },
  386. # endif /* L001000 */
  387. # ifdef    CRTKIL
  388.     { "crtkil",    CRTKIL,    M_CONTROL },
  389. # endif /* CRTKIL */
  390. # ifdef    PASS8
  391.     { "pass8",    PASS8,    M_CONTROL },
  392. # endif /* PASS8 */
  393. # ifdef    CTLECH
  394.     { "ctlech",    CTLECH,    M_CONTROL },
  395. # endif /* CTLECH */
  396. # ifdef    PENDIN
  397.     { "pendin",    PENDIN,    M_CONTROL },
  398. # endif /* PENDIN */
  399. # ifdef    DECCTQ
  400.     { "decctq",    DECCTQ,    M_CONTROL },
  401. # endif /* DECCTQ */
  402. # ifdef    NOFLSH
  403.     { "noflsh",    NOFLSH,    M_CONTROL },
  404. # endif /* NOFLSH */
  405.  
  406. # ifdef    LCRTBS
  407.     { "lcrtbs",    LCRTBS,    M_LOCAL },
  408. # endif /* LCRTBS */
  409. # ifdef    LPRTERA
  410.     { "lprtera",LPRTERA,M_LOCAL },
  411. # endif /* LPRTERA */
  412. # ifdef    LCRTERA
  413.     { "lcrtera",LCRTERA,M_LOCAL },
  414. # endif /* LCRTERA */
  415. # ifdef    LTILDE
  416.     { "ltilde",    LTILDE,    M_LOCAL },
  417. # endif /* LTILDE */
  418. # ifdef    LMDMBUF
  419.     { "lmdmbuf",LMDMBUF,M_LOCAL },
  420. # endif /* LMDMBUF */
  421. # ifdef    LLITOUT
  422.     { "llitout",LLITOUT,M_LOCAL },
  423. # endif /* LLITOUT */
  424. # ifdef    LTOSTOP
  425.     { "ltostop",LTOSTOP,M_LOCAL },
  426. # endif /* LTOSTOP */
  427. # ifdef    LFLUSHO
  428.     { "lflusho",LFLUSHO,M_LOCAL },
  429. # endif /* LFLUSHO */
  430. # ifdef    LNOHANG
  431.     { "lnohang",LNOHANG,M_LOCAL },
  432. # endif /* LNOHANG */
  433. # ifdef    LCRTKIL
  434.     { "lcrtkil",LCRTKIL,M_LOCAL },
  435. # endif /* LCRTKIL */
  436. # ifdef    LPASS8
  437.     { "lpass8",    LPASS8,    M_LOCAL },
  438. # endif /* LPASS8 */    
  439. # ifdef    LCTLECH
  440.     { "lctlech",LCTLECH,M_LOCAL },
  441. # endif /* LCTLECH */
  442. # ifdef    LPENDIN
  443.     { "lpendin",LPENDIN,M_LOCAL },
  444. # endif /* LPENDIN */
  445. # ifdef    LDECCTQ
  446.     { "ldecctq",LDECCTQ,M_LOCAL },
  447. # endif /* LDECCTQ */
  448. # ifdef    LNOFLSH
  449.     { "lnoflsh",LNOFLSH,M_LOCAL },
  450. # endif /* LNOFLSH */
  451.  
  452. #endif /* POSIX || TERMIO */
  453. # if defined(VINTR) || defined(TIOCGETC)
  454.     { "intr",        C_SH(C_INTR),     M_CHAR },
  455. # endif /* VINTR */
  456. # if defined(VQUIT) || defined(TIOCGETC)
  457.     { "quit",        C_SH(C_QUIT),     M_CHAR },
  458. # endif /* VQUIT */
  459. # if defined(VERASE) || defined(TIOCGETP)
  460.     { "erase",        C_SH(C_ERASE),     M_CHAR },
  461. # endif /* VERASE */
  462. # if defined(VKILL) || defined(TIOCGETP)
  463.     { "kill",        C_SH(C_KILL),     M_CHAR },
  464. # endif /* VKILL */
  465. # if defined(VEOF) || defined(TIOCGETC)
  466.     { "eof",        C_SH(C_EOF),     M_CHAR },
  467. # endif /* VEOF */
  468. # if defined(VEOL)
  469.     { "eol",        C_SH(C_EOL),     M_CHAR },
  470. # endif /* VEOL */
  471. # if defined(VEOL2)
  472.     { "eol2",        C_SH(C_EOL2),     M_CHAR },
  473. # endif  /* VEOL2 */
  474. # if defined(VSWTCH)
  475.     { "swtch",        C_SH(C_SWTCH),     M_CHAR },
  476. # endif /* VSWTCH */
  477. # if defined(VDSWTCH)
  478.     { "dswtch",        C_SH(C_DSWTCH),    M_CHAR },
  479. # endif /* VDSWTCH */
  480. # if defined(VERASE2)
  481.     { "erase2",        C_SH(C_ERASE2),    M_CHAR },
  482. # endif /* VERASE2 */
  483. # if defined(VSTART) || defined(TIOCGETC)
  484.     { "start",        C_SH(C_START),     M_CHAR },
  485. # endif /* VSTART */
  486. # if defined(VSTOP) || defined(TIOCGETC)
  487.     { "stop",        C_SH(C_STOP),     M_CHAR },
  488. # endif /* VSTOP */
  489. # if defined(VWERASE) || defined(TIOCGLTC)
  490.     { "werase",        C_SH(C_WERASE),    M_CHAR },
  491. # endif /* VWERASE */
  492. # if defined(VSUSP) || defined(TIOCGLTC)
  493.     { "susp",        C_SH(C_SUSP),     M_CHAR },
  494. # endif /* VSUSP */
  495. # if defined(VDSUSP) || defined(TIOCGLTC)
  496.     { "dsusp",        C_SH(C_DSUSP),     M_CHAR },
  497. # endif /* VDSUSP */
  498. # if defined(VREPRINT) || defined(TIOCGLTC)
  499.     { "reprint",    C_SH(C_REPRINT),M_CHAR },
  500. # endif /* WREPRINT */
  501. # if defined(VDISCARD) || defined(TIOCGLTC)
  502.     { "discard",    C_SH(C_DISCARD),M_CHAR },
  503. # endif /* VDISCARD */
  504. # if defined(VLNEXT) || defined(TIOCGLTC)
  505.     { "lnext",        C_SH(C_LNEXT),     M_CHAR },
  506. # endif /* VLNEXT */
  507. # if defined(VSTATUS) || defined(TIOCGPAGE)
  508.     { "status",        C_SH(C_STATUS),    M_CHAR },
  509. # endif /* VSTATUS */
  510. # if defined(VPAGE) || defined(TIOCGPAGE)
  511.     { "page",        C_SH(C_PAGE),     M_CHAR },
  512. # endif /* VPAGE */
  513. # if defined(VPGOFF) || defined(TIOCGPAGE)
  514.     { "pgoff",        C_SH(C_PGOFF),     M_CHAR },
  515. # endif /* VPGOFF */
  516. # if defined(VKILL2) 
  517.     { "kill2",        C_SH(C_KILL2),     M_CHAR },
  518. # endif /* VKILL2 */
  519. # if defined(VBRK) || defined(TIOCGETC)
  520.     { "brk",        C_SH(C_BRK),     M_CHAR },
  521. # endif /* VBRK */
  522. # if defined(VMIN)
  523.     { "min",        C_SH(C_MIN),     M_CHAR },
  524. # endif /* VMIN */
  525. # if defined(VTIME)
  526.     { "time",        C_SH(C_TIME),     M_CHAR },
  527. # endif /* VTIME */
  528.     { NULL, 0, -1 },
  529. };
  530.  
  531. /* Retry a system call */
  532. #define RETRY(x) \
  533.    do \
  534.     if ((x) == -1) \
  535.        if (errno != EINTR) \
  536.            return -1; \
  537.        else \
  538.            continue; \
  539.     else \
  540.        break; \
  541.    while (1)
  542.  
  543. /*ARGSUSED*/
  544. void
  545. dosetty(v, t)
  546.     Char **v;
  547.     struct command *t;
  548. {
  549.     struct tcshmodes *m;
  550.     char x, *d;
  551.     int aflag = 0;
  552.     Char *s;
  553.     int z = EX_IO;
  554.     char cmdname[BUFSIZE];
  555.  
  556.     setname(strcpy(cmdname, short2str(*v++)));
  557.  
  558.     while (v && *v && v[0][0] == '-' && v[0][2] == '\0') 
  559.     switch (v[0][1]) {
  560.     case 'a':
  561.         aflag++;
  562.         v++;
  563.         break;
  564.     case 'd':
  565.         v++;
  566.         z = ED_IO;
  567.         break;
  568.     case 'x':
  569.         v++;
  570.         z = EX_IO;
  571.         break;
  572.     case 'q':
  573.         v++;
  574.         z = QU_IO;
  575.         break;
  576.     default:
  577.         stderror(ERR_NAME | ERR_SYSTEM, short2str(v[0]), 
  578.              "Unknown switch");
  579.         break;
  580.     }
  581.  
  582.     didsetty = 1;
  583.     if (!v || !*v) {
  584.     int i = -1;
  585.     int len = 0, st = 0, cu;
  586.     for (m = modelist; m->m_name; m++) {
  587.         if (m->m_type != i) {
  588.         xprintf("%s%s", i != -1 ? "\n" : "", 
  589.             ttylist[z][m->m_type].t_name);
  590.         i = m->m_type;
  591.         st = len = strlen(ttylist[z][m->m_type].t_name);
  592.         }
  593.  
  594.         x = (ttylist[z][i].t_setmask & m->m_value) ? '+' : '\0';
  595.         x = (ttylist[z][i].t_clrmask & m->m_value) ? '-' : x;
  596.  
  597.         if (x != '\0' || aflag) {
  598.         cu = strlen(m->m_name) + (x != '\0') + 1;
  599.         if (len + cu >= T_Cols) {
  600.             xprintf("\n%*s", st, "");
  601.             len = st + cu;
  602.         }
  603.         else 
  604.             len += cu;
  605.         if (x != '\0')
  606.             xprintf("%c%s ", x, m->m_name);
  607.         else
  608.             xprintf("%s ", m->m_name);
  609.         }
  610.     }
  611.     xputchar('\n');
  612.     return;
  613.     }
  614.     while (v && (s = *v++)) {
  615.     switch (*s) {
  616.     case '+':
  617.     case '-':
  618.         x = *s++;
  619.         break;
  620.     default:
  621.         x = '\0';
  622.         break;
  623.     }
  624.     d = short2str(s);
  625.     for (m = modelist; m->m_name; m++)
  626.         if (strcmp(m->m_name, d) == 0)
  627.         break;
  628.     if (!m->m_name) 
  629.         stderror(ERR_NAME | ERR_SYSTEM, d, "Invalid argument");
  630.  
  631.     switch (x) {
  632.     case '+':
  633.         ttylist[z][m->m_type].t_setmask |= m->m_value;
  634.         ttylist[z][m->m_type].t_clrmask &= ~m->m_value;
  635.         break;
  636.     case '-':
  637.         ttylist[z][m->m_type].t_setmask &= ~m->m_value;
  638.         ttylist[z][m->m_type].t_clrmask |= m->m_value;
  639.         break;
  640.     default:
  641.         ttylist[z][m->m_type].t_setmask &= ~m->m_value;
  642.         ttylist[z][m->m_type].t_clrmask &= ~m->m_value;
  643.         break;
  644.     }
  645.     }
  646. } /* end dosetty */
  647.  
  648. int
  649. tty_getty(fd, td)
  650.    int fd;
  651.    ttydata_t *td;
  652. {
  653. #ifdef POSIX
  654.     RETRY(tcgetattr(fd, &td->d_t));
  655. #else /* TERMIO || GSTTY */
  656. # ifdef TERMIO
  657.     RETRY(ioctl(fd, TCGETA,    (ioctl_t) &td->d_t));
  658. # else /* GSTTY */
  659. #  ifdef TIOCGETP
  660.     if (ioctl(fd, TIOCGETP,  (ioctl_t) &td->d_t) == -1)
  661.     return -1;
  662. #  endif /* TIOCGETP */
  663. #  ifdef TIOCGETC
  664.     if (ioctl(fd, TIOCGETC,  (ioctl_t) &td->d_tc) == -1)
  665.     return -1;
  666. #  endif /* TIOCGETC */
  667. #  ifdef TIOCGPAGE
  668.     if (ioctl(fd, TIOCGPAGE, (ioctl_t) &td->d_pc) == -1)
  669.     return -1;
  670. #  endif /* TIOCGPAGE */
  671. #  ifdef TIOCLGET
  672.     if (ioctl(fd, TIOCLGET,  (ioctl_t) &td->d_lb) == -1)
  673.     return -1;
  674. #  endif /* TIOCLGET */
  675. # endif /* TERMIO */
  676. #endif /* POSIX */
  677.  
  678. #ifdef TIOCGLTC
  679.     if (ioctl(fd, TIOCGLTC,  (ioctl_t) &td->d_ltc) == -1)
  680.     return -1;
  681. #endif /* TIOCGLTC */
  682.  
  683.     return 0;
  684. }
  685.  
  686. int
  687. tty_setty(fd, td)
  688.    int fd;
  689.    ttydata_t *td;
  690. {
  691. #ifdef POSIX
  692.     RETRY(tcsetattr(fd, TCSADRAIN, &td->d_t)); 
  693. #else
  694. # ifdef TERMIO
  695.     RETRY(ioctl(fd, TCSETAW,    (ioctl_t) &td->d_t));
  696. # else
  697. #  ifdef TIOCSETN
  698.     if (ioctl(fd, TIOCSETN,  (ioctl_t) &td->d_t) == -1)
  699.     return -1;
  700. #  endif /* TIOCSETN */
  701. #  ifdef TIOCGETC
  702.     if (ioctl(fd, TIOCSETC,  (ioctl_t) &td->d_tc) == -1)
  703.     return -1;
  704. #  endif /* TIOCGETC */
  705. #  ifdef TIOCGPAGE
  706.     if (ioctl(fd, TIOCSPAGE, (ioctl_t) &td->d_pc) == -1)
  707.     return -1;
  708. #  endif /* TIOCGPAGE */
  709. #  ifdef TIOCLGET
  710.     if (ioctl(fd, TIOCLSET,  (ioctl_t) &td->d_lb) == -1)
  711.     return -1;
  712. #  endif /* TIOCLGET */
  713. # endif /* TERMIO */
  714. #endif /* POSIX */
  715.  
  716. #ifdef TIOCGLTC
  717.     if (ioctl(fd, TIOCSLTC,  (ioctl_t) &td->d_ltc) == -1)
  718.     return -1;
  719. #endif /* TIOCGLTC */
  720.  
  721.     return 0;
  722. }
  723.  
  724. void
  725. tty_getchar(td, s)
  726.     ttydata_t *td;
  727.     unsigned char *s;
  728. {   
  729. #ifdef TIOCGLTC
  730.     {
  731.     struct ltchars *n = &td->d_ltc;
  732.  
  733.     s[C_SUSP]    = n->t_suspc;
  734.     s[C_DSUSP]    = n->t_dsuspc;
  735.     s[C_REPRINT]    = n->t_rprntc;
  736.     s[C_DISCARD]    = n->t_flushc;
  737.     s[C_WERASE]    = n->t_werasc;
  738.     s[C_LNEXT]    = n->t_lnextc;
  739.     }
  740. #endif /* TIOCGLTC */
  741.  
  742. #if defined(POSIX) || defined(TERMIO)
  743.     {
  744. # ifdef POSIX
  745.     struct termios *n = &td->d_t;
  746. # else
  747.     struct termio *n = &td->d_t;
  748. # endif /* POSIX */
  749.  
  750. # ifdef VINTR
  751.     s[C_INTR]    = n->c_cc[VINTR];
  752. # endif /* VINTR */
  753. # ifdef VQUIT
  754.     s[C_QUIT]    = n->c_cc[VQUIT];
  755. # endif /* VQUIT */
  756. # ifdef VERASE
  757.     s[C_ERASE]    = n->c_cc[VERASE];
  758. # endif /* VERASE */
  759. # ifdef VKILL
  760.     s[C_KILL]    = n->c_cc[VKILL];
  761. # endif /* VKILL */
  762. # ifdef VEOF
  763.     s[C_EOF]    = n->c_cc[VEOF];
  764. # endif /* VEOF */
  765. # ifdef VEOL
  766.     s[C_EOL]    = n->c_cc[VEOL];
  767. # endif /* VEOL */
  768. # ifdef VEOL2
  769.     s[C_EOL2]    = n->c_cc[VEOL2];
  770. # endif  /* VEOL2 */
  771. # ifdef VSWTCH
  772.     s[C_SWTCH]    = n->c_cc[VSWTCH];
  773. # endif /* VSWTCH */
  774. # ifdef VDSWTCH
  775.     s[C_DSWTCH]    = n->c_cc[VDSWTCH];
  776. # endif /* VDSWTCH */
  777. # ifdef VERASE2
  778.     s[C_ERASE2]    = n->c_cc[VERASE2];
  779. # endif /* VERASE2 */
  780. # ifdef VSTART
  781.     s[C_START]    = n->c_cc[VSTART];
  782. # endif /* VSTART */
  783. # ifdef VSTOP
  784.     s[C_STOP]    = n->c_cc[VSTOP];
  785. # endif /* VSTOP */
  786. # ifdef VWERASE
  787.     s[C_WERASE]    = n->c_cc[VWERASE];
  788. # endif /* VWERASE */
  789. # ifdef VSUSP
  790.     s[C_SUSP]    = n->c_cc[VSUSP];
  791. # endif /* VSUSP */
  792. # ifdef VDSUSP
  793.     s[C_DSUSP]    = n->c_cc[VDSUSP];
  794. # endif /* VDSUSP */
  795. # ifdef VREPRINT
  796.     s[C_REPRINT]    = n->c_cc[VREPRINT];
  797. # endif /* WREPRINT */
  798. # ifdef VDISCARD
  799.     s[C_DISCARD]    = n->c_cc[VDISCARD];
  800. # endif /* VDISCARD */
  801. # ifdef VLNEXT
  802.     s[C_LNEXT]    = n->c_cc[VLNEXT];
  803. # endif /* VLNEXT */
  804. # ifdef VSTATUS
  805.     s[C_STATUS]    = n->c_cc[VSTATUS];
  806. # endif /* VSTATUS */
  807. # ifdef VPAGE
  808.     s[C_PAGE]    = n->c_cc[VPAGE];
  809. # endif /* VPAGE */
  810. # ifdef VPGOFF
  811.     s[C_PGOFF]    = n->c_cc[VPGOFF];
  812. # endif /* VPGOFF */
  813. # ifdef VKILL2
  814.     s[C_KILL2]    = n->c_cc[VKILL2];
  815. # endif /* KILL2 */
  816. # ifdef VMIN
  817.     s[C_MIN]    = n->c_cc[VMIN];
  818. # endif /* VMIN */
  819. # ifdef VTIME
  820.     s[C_TIME]    = n->c_cc[VTIME];
  821. # endif /* VTIME */
  822.     }
  823.  
  824. #else /* SGTTY */
  825.  
  826. # ifdef TIOCGPAGE
  827.     {
  828.     struct ttypagestat *n = &td->d_pc;
  829.  
  830.     s[C_STATUS]    = n->tps_statc;
  831.     s[C_PAGE]    = n->tps_pagec;
  832.     s[C_PGOFF]    = n->tps_pgoffc;
  833.     }
  834. # endif /* TIOCGPAGE */
  835.  
  836. # ifdef TIOCGETC
  837.     {
  838.     struct tchars *n = &td->d_tc;
  839.  
  840.     s[C_INTR]    = n->t_intrc;
  841.     s[C_QUIT]    = n->t_quitc;
  842.     s[C_START]    = n->t_startc;
  843.     s[C_STOP]    = n->t_stopc;
  844.     s[C_EOF]    = n->t_eofc;
  845.     s[C_BRK]    = n->t_brkc;
  846.     }
  847. # endif /* TIOCGETC */
  848.  
  849. # ifdef TIOCGETP
  850.     {
  851.     struct sgttyb *n = &td->d_t;
  852.  
  853.     s[C_ERASE]    = n->sg_erase;
  854.     s[C_KILL]    = n->sg_kill;
  855.     }
  856. # endif /* TIOCGETP */
  857. #endif /* !POSIX || TERMIO */
  858.  
  859. } /* tty_getchar */
  860.  
  861.  
  862. void
  863. tty_setchar(td, s)
  864.     ttydata_t *td;
  865.     unsigned char *s;
  866. {   
  867. #ifdef TIOCGLTC
  868.     {
  869.     struct ltchars *n = &td->d_ltc; 
  870.  
  871.     n->t_suspc         = s[C_SUSP];
  872.     n->t_dsuspc        = s[C_DSUSP];
  873.     n->t_rprntc        = s[C_REPRINT];
  874.     n->t_flushc        = s[C_DISCARD];
  875.     n->t_werasc        = s[C_WERASE];
  876.     n->t_lnextc        = s[C_LNEXT];
  877.     }
  878. #endif /* TIOCGLTC */
  879.  
  880. #if defined(POSIX) || defined(TERMIO)
  881.     {
  882. # ifdef POSIX
  883.     struct termios *n = &td->d_t;
  884. # else
  885.     struct termio *n = &td->d_t;
  886. # endif /* POSIX */
  887.  
  888. # ifdef VINTR
  889.     n->c_cc[VINTR]        = s[C_INTR];
  890. # endif /* VINTR */
  891. # ifdef VQUIT
  892.     n->c_cc[VQUIT]        = s[C_QUIT];
  893. # endif /* VQUIT */
  894. # ifdef VERASE
  895.     n->c_cc[VERASE]        = s[C_ERASE];
  896. # endif /* VERASE */
  897. # ifdef VKILL
  898.     n->c_cc[VKILL]        = s[C_KILL];
  899. # endif /* VKILL */
  900. # ifdef VEOF
  901.     n->c_cc[VEOF]        = s[C_EOF];
  902. # endif /* VEOF */
  903. # ifdef VEOL
  904.     n->c_cc[VEOL]        = s[C_EOL];
  905. # endif /* VEOL */
  906. # ifdef VEOL2
  907.     n->c_cc[VEOL2]        = s[C_EOL2];
  908. # endif  /* VEOL2 */
  909. # ifdef VSWTCH
  910.     n->c_cc[VSWTCH]        = s[C_SWTCH];
  911. # endif /* VSWTCH */
  912. # ifdef VDSWTCH
  913.     n->c_cc[VDSWTCH]    = s[C_DSWTCH];
  914. # endif /* VDSWTCH */
  915. # ifdef VERASE2
  916.     n->c_cc[VERASE2]    = s[C_ERASE2];
  917. # endif /* VERASE2 */
  918. # ifdef VSTART
  919.     n->c_cc[VSTART]        = s[C_START];
  920. # endif /* VSTART */
  921. # ifdef VSTOP
  922.     n->c_cc[VSTOP]        = s[C_STOP];
  923. # endif /* VSTOP */
  924. # ifdef VWERASE
  925.     n->c_cc[VWERASE]    = s[C_WERASE];
  926. # endif /* VWERASE */
  927. # ifdef VSUSP
  928.     n->c_cc[VSUSP]        = s[C_SUSP];
  929. # endif /* VSUSP */
  930. # ifdef VDSUSP
  931.     n->c_cc[VDSUSP]        = s[C_DSUSP];
  932. # endif /* VDSUSP */
  933. # ifdef VREPRINT
  934.     n->c_cc[VREPRINT]    = s[C_REPRINT];
  935. # endif /* WREPRINT */
  936. # ifdef VDISCARD
  937.     n->c_cc[VDISCARD]    = s[C_DISCARD];
  938. # endif /* VDISCARD */
  939. # ifdef VLNEXT
  940.     n->c_cc[VLNEXT]        = s[C_LNEXT];
  941. # endif /* VLNEXT */
  942. # ifdef VSTATUS
  943.     n->c_cc[VSTATUS]    = s[C_STATUS];
  944. # endif /* VSTATUS */
  945. # ifdef VPAGE
  946.     n->c_cc[VPAGE]        = s[C_PAGE];
  947. # endif /* VPAGE */
  948. # ifdef VPGOFF
  949.     n->c_cc[VPGOFF]        = s[C_PGOFF];
  950. # endif /* VPGOFF */
  951. # ifdef VKILL2
  952.     n->c_cc[VKILL2]        = s[C_KILL2];
  953. # endif /* VKILL2 */
  954. # ifdef VMIN
  955.     n->c_cc[VMIN]        = s[C_MIN];
  956. # endif /* VMIN */
  957. # ifdef VTIME
  958.     n->c_cc[VTIME]        = s[C_TIME];
  959. # endif /* VTIME */
  960.     }
  961.  
  962. #else /* GSTTY */
  963.  
  964. # ifdef TIOCGPAGE
  965.     {
  966.     struct ttypagestat *n = &td->d_pc;
  967.  
  968.     n->tps_length        = 0;
  969.     n->tps_lpos        = 0;
  970.     n->tps_statc        = s[C_STATUS];
  971.     n->tps_pagec        = s[C_PAGE];
  972.     n->tps_pgoffc        = s[C_PGOFF];
  973.     n->tps_flag        = 0;
  974.     }
  975. # endif /* TIOCGPAGE */
  976.  
  977. # ifdef TIOCGETC
  978.     {
  979.     struct tchars *n = &td->d_tc;
  980.     n->t_intrc        = s[C_INTR];
  981.     n->t_quitc        = s[C_QUIT];
  982.     n->t_startc        = s[C_START];
  983.     n->t_stopc        = s[C_STOP];
  984.     n->t_eofc        = s[C_EOF];
  985.     n->t_brkc        = s[C_BRK];
  986.     }
  987. # endif /* TIOCGETC */
  988.  
  989. # ifdef TIOCGETP
  990.     {
  991.     struct sgttyb *n = &td->d_t;
  992.  
  993.     n->sg_erase        = s[C_ERASE];
  994.     n->sg_kill        = s[C_KILL];
  995.     }
  996. # endif /* TIOCGETP */
  997. #endif /* !POSIX || TERMIO */
  998.  
  999. } /* tty_setchar */
  1000.  
  1001. speed_t
  1002. tty_getspeed(td)
  1003.     ttydata_t *td;
  1004. {
  1005.     speed_t spd;
  1006.  
  1007. #ifdef POSIX
  1008.     if ((spd = cfgetispeed(&td->d_t)) == 0)
  1009.     spd = cfgetospeed(&td->d_t);
  1010. #else /* ! POSIX */
  1011. # ifdef TERMIO
  1012. #  ifdef CBAUD
  1013.     spd = td->d_t.c_cflag & CBAUD;
  1014. #  else 
  1015.     spd = 0;
  1016. #  endif 
  1017. # else /* SGTTY */
  1018.     spd = td->d_t.sg_ispeed;
  1019. # endif /* TERMIO */
  1020. #endif /* POSIX */
  1021.  
  1022.     return spd;
  1023. } /* end tty_getspeed */
  1024.  
  1025. int
  1026. tty_gettabs(td)
  1027.     ttydata_t *td;
  1028. {
  1029. #if defined(POSIX) || defined(TERMIO)
  1030.     return ((td->d_t.c_oflag & TAB3) == TAB3) ? 0 : 1;
  1031. #else /* SGTTY */
  1032.     return (td->d_t.sg_flags & XTABS) == XTABS ? 0 : 1;
  1033. #endif /* POSIX || TERMIO */
  1034. } /* end tty_gettabs */
  1035.  
  1036. int
  1037. tty_geteightbit(td)
  1038.     ttydata_t *td;
  1039. {
  1040. #if defined(POSIX) || defined(TERMIO)
  1041.     return (td->d_t.c_cflag & CSIZE) == CS8;
  1042. #else /* SGTTY */
  1043.     return td->d_lb & (LPASS8 | LLITOUT);
  1044. #endif /* POSIX || TERMIO */
  1045. } /* end tty_geteightbit */
  1046.  
  1047. int
  1048. tty_cooked_mode(td)
  1049.     ttydata_t *td;
  1050. {
  1051. #if defined(POSIX) || defined(TERMIO)
  1052.     return (td->d_t.c_lflag & ICANON);
  1053. #else /* SGTTY */
  1054.     return !(td->d_t.sg_flags & (RAW | CBREAK));
  1055. #endif /* POSIX || TERMIO */
  1056. } /* end tty_cooked_mode */
  1057.  
  1058. #ifdef _IBMR2
  1059. void
  1060. tty_setdisc(fd, dis)
  1061.     int fd;
  1062.     int dis;
  1063. {
  1064.     static bool edit_discipline = 0;
  1065.     static union txname tx_disc;
  1066.     extern char strPOSIX[];
  1067.  
  1068.     switch (dis) {
  1069.     case EX_IO:
  1070.     if (edit_discipline) {
  1071.         if (ioctl(fd, TXSETLD, (ioctl_t) & tx_disc) == -1)
  1072.         return;
  1073.         edit_discipline = 0;
  1074.     }
  1075.     return;
  1076.  
  1077.     case ED_IO:
  1078.     tx_disc.tx_which = 0;
  1079.     if (ioctl(fd, TXGETLD, (ioctl_t) & tx_disc) == -1)
  1080.         return;
  1081.     if (strcmp(tx_disc.tx_name, strPOSIX) != 0) {
  1082.         edit_discipline = 1;
  1083.         if (ioctl(fd, TXSETLD, (ioctl_t) strPOSIX) == -1)
  1084.         return;
  1085.     }
  1086.     return;
  1087.  
  1088.     default:
  1089.     return;
  1090.     }
  1091. } /* end tty_setdisc */
  1092. #endif /* _IBMR2 */
  1093.  
  1094. #ifdef DEBUG_TTY
  1095. static void
  1096. tty_printchar(s)
  1097.     unsigned char *s;
  1098. {
  1099.     struct tcshmodes *m;
  1100.     int i;
  1101.  
  1102.     for (i = 0; i < C_NCC; i++) {
  1103.     for (m = modelist; m->m_name; m++) 
  1104.         if (m->m_type == M_CHAR && C_SH(i) == m->m_value)
  1105.         break;
  1106.     if (m->m_name)
  1107.         xprintf("%s ^%c ", m->m_name, s[i] + 'A' - 1);
  1108.     if (i % 5 == 0)
  1109.         xputchar('\n');
  1110.     }
  1111.     xputchar('\n');
  1112. }
  1113. #endif /* DEBUG_TTY */
  1114.